#include "ticket2.h"
#include "stdio.h"
#include "string.h"
#include "time.h"
#include "lvgl/lvgl.h"  // 确保包含LVGL头文件
LV_FONT_DECLARE(lv_font_sunti_24);    // 导入字体
LV_FONT_DECLARE(lv_font_fan_24);


// 1. 常量定义（界面尺寸、功能参数）
#define KEYBOARD_WIDTH     300    // 数字键盘宽度
#define KEYBOARD_HEIGHT    300    // 数字键盘高度
#define KEYBOARD_BTN_WIDTH 80     // 键盘按钮宽度
#define KEYBOARD_BTN_HEIGHT 50    // 键盘按钮高度
#define VERIFY_CODE_LENGTH 6      // 验证码长度（6位）
#define COOLDOWN_SECONDS   60     // 验证码倒计时（60秒）
#define TICKET_CODE_MAX_LEN 20    // 取票码最大长度
#define RESET_BTN_DELAY    2000   // 按钮状态重置延迟（2秒）
#define SUCCESS_RESET_DELAY 5000  // 取票成功后UI重置延迟（5秒）

// 2. 全局变量（状态管理、UI对象引用）
static int verify_cooldown = 0;                          // 验证码倒计时计数器
static char generated_verify_code[VERIFY_CODE_LENGTH + 1] = {0};  // 生成的验证码（含结束符）
static lv_obj_t *current_input = NULL;                   // 当前聚焦的输入框
static lv_obj_t *num_keyboard = NULL;                    // 数字键盘对象
static lv_timer_t *cooldown_timer = NULL;                // 倒计时定时器
static lv_timer_t *reset_btn_timer = NULL;               // 按钮状态重置定时器
static void input_blurred(lv_event_t *e);                // 输入框失焦回调


// 3. 数字键盘按钮文本（12个按钮：0-9、清空c、删除delet）
static const char *btn_texts[] = {
    "1", "2", "3", 
    "4", "5", "6", 
    "7", "8", "9", 
    "c", "0", "delet"
};

// 4. 函数声明（避免C语言编译顺序问题）
static void generate_verify_code(void);                  // 生成6位数字验证码
static void update_verify_btn_state(void);               // 更新验证码按钮状态
static void cooldown_timer_cb(lv_timer_t *timer);        // 倒计时定时器回调
static void reset_verify_btn_style(lv_timer_t *timer);   // 重置验证码按钮样式
static void reset_take_btn_style(lv_timer_t *timer);     // 重置取票按钮样式
static lv_obj_t *get_btn_label_safe(lv_obj_t *btn);      // 安全获取按钮标签
static void num_keyboard_event_cb(lv_event_t *e);        // 数字键盘按钮回调
static void keyboard_click_handler(lv_event_t *e);       // 键盘空白区域点击回调
static void hide_keyboard_timer_cb(lv_timer_t *t);       // 延迟隐藏键盘回调
static void success_reset_ui_cb(lv_timer_t *timer);      // 取票成功后UI重置回调
static void create_num_keyboard(void);                   // 创建数字键盘
static void input_focused(lv_event_t *e);                // 输入框聚焦回调
static void input_blurred(lv_event_t *e);                // 输入框失焦回调
static void send_verify_event_cb(lv_event_t *e);         // 发送验证码按钮回调
static void take_ticket_event_cb(lv_event_t *e);         // 取票按钮回调

// 5. 工具函数：安全获取按钮的标签对象（适配LVGL 8.3，无类型检查）
static lv_obj_t *get_btn_label_safe(lv_obj_t *btn) {
    if (!btn) {  // 检查按钮对象是否有效
        printf("[WARN] get_btn_label_safe: Button is NULL\n");
        return NULL;
    }
    // 约定：按钮的第1个子对象为标签（UI设计需遵循此规则）
    lv_obj_t *label = lv_obj_get_child(btn, 0);
    if (!label) {  // 检查标签是否存在
        printf("[WARN] get_btn_label_safe: Button has no label child\n");
    }
    return label;
}
    
// 6. 验证码生成：生成随机6位数字
static void generate_verify_code(void) {
    static int rand_inited = 0;
    if (!rand_inited) {  // 避免短时间多次调用导致验证码重复
        srand((unsigned int)time(NULL));
        rand_inited = 1;
    }
    // 生成6位数字（0-9）
    for (int i = 0; i < VERIFY_CODE_LENGTH; i++) {
        generated_verify_code[i] = '0' + (rand() % 10);
    }
    generated_verify_code[VERIFY_CODE_LENGTH] = '\0';  // 字符串结束符
}

// 7. 验证码按钮状态更新：控制倒计时显示、颜色、点击权限（修改后）
static void update_verify_btn_state(void) {
    // 检查核心UI对象有效性（避免空指针访问）
    if (!ui_Button8) {
        printf("[ERROR] update_verify_btn_state: ui_Button8 is NULL\n");
        return;
    }
    lv_obj_t *btn_label = get_btn_label_safe(ui_Button8);
    if (!btn_label) return;

    if (verify_cooldown > 0) {  // 倒计时中：禁用点击、灰色背景、显示秒数（补充字体）
        char buf[32] = {0};
        snprintf(buf, sizeof(buf), "%ds", verify_cooldown);
        lv_label_set_text(btn_label, buf);
        // 关键：强制设置倒计时文本字体（解决乱码）
        lv_obj_set_style_text_font(btn_label, &lv_font_fan_24, 0);
        lv_obj_set_style_bg_color(ui_Button8, lv_palette_main(LV_PALETTE_GREY), 0);
        lv_obj_clear_flag(ui_Button8, LV_OBJ_FLAG_CLICKABLE);
        verify_cooldown--;  // 倒计时减1
    } else {  // 倒计时结束：启用点击、蓝色背景、显示“获取验证码”（补充字体）
        lv_label_set_text(btn_label, "获取验证码");
        // 关键：强制设置恢复文本字体（避免后续切换乱码）
        lv_obj_set_style_text_font(btn_label, &lv_font_sunti_24, 0);
        lv_obj_set_style_bg_color(ui_Button8, lv_palette_main(LV_PALETTE_BLUE), 0);
        lv_obj_add_flag(ui_Button8, LV_OBJ_FLAG_CLICKABLE);
        // 销毁过期定时器（避免内存泄漏）
        if (cooldown_timer) {
            lv_timer_del(cooldown_timer);
            cooldown_timer = NULL;
        }
    }
}

// 8. 倒计时定时器回调：每秒触发一次状态更新
static void cooldown_timer_cb(lv_timer_t *timer) {
    update_verify_btn_state();
}

// 9. 验证码按钮样式重置：恢复蓝色背景和默认文本
static void reset_verify_btn_style(lv_timer_t *timer) {
    if (!ui_Button8) return;
    // 仅在非倒计时状态下重置（避免覆盖倒计时）
    if (verify_cooldown <= 0) {
        lv_obj_set_style_bg_color(ui_Button8, lv_palette_main(LV_PALETTE_BLUE), 0);
        lv_obj_t *btn_label = get_btn_label_safe(ui_Button8);
        if (btn_label) {
            lv_label_set_text(btn_label, "获取验证码");
            // 强制设置字体，避免乱码
            lv_obj_set_style_text_font(btn_label, &lv_font_sunti_24, 0);
        }
        lv_obj_add_flag(ui_Button8, LV_OBJ_FLAG_CLICKABLE); // 恢复可点击
    }
    reset_btn_timer = NULL;  // 重置定时器引用
}

// 10. 取票按钮样式重置：恢复蓝色背景和“取票”文本
static void reset_take_btn_style(lv_timer_t *timer) {
    if (!ui_Button9) return;
    lv_obj_set_style_bg_color(ui_Button9, lv_palette_main(LV_PALETTE_BLUE), 0);
    lv_obj_t *btn_label = get_btn_label_safe(ui_Button9);
    if (btn_label) {
        lv_label_set_text(btn_label, "取票");
        lv_obj_set_style_text_font(btn_label, &lv_font_sunti_24, 0);
    }
}

// 11. 数字键盘按钮回调：处理输入、清空、删除逻辑
static void num_keyboard_event_cb(lv_event_t *e) {
    // 获取点击的按钮和按钮文本
    lv_obj_t *btn = lv_event_get_target(e);
    lv_obj_t *btn_label = get_btn_label_safe(btn);
    if (!btn_label || !current_input) return;  // 无标签或无当前输入框则退出
    
    const char *btn_txt = lv_label_get_text(btn_label);
    const char *current_txt = lv_textarea_get_text(current_input);
    char new_txt[TICKET_CODE_MAX_LEN + 1] = {0};  // 确保缓冲区足够
    size_t current_len = strlen(current_txt ? current_txt : "");  // 处理NULL情况

    // 1. 清空操作（点击"c"）
    if (strcmp(btn_txt, "c") == 0) {
        lv_textarea_set_text(current_input, "");
    }
    // 2. 删除操作（点击"delet"）
    else if (strcmp(btn_txt, "delet") == 0) {
        if (current_len > 0) {
            strncpy(new_txt, current_txt, current_len - 1);
            new_txt[current_len - 1] = '\0';
            lv_textarea_set_text(current_input, new_txt);
        }
    }
    // 3. 数字输入（点击0-9）
    else {
        // 根据输入框类型限制最大长度（取票码20位，验证码6位）
        size_t max_len = (current_input == ui_TextArea1) ? TICKET_CODE_MAX_LEN : VERIFY_CODE_LENGTH;
        if (current_len < max_len) {
            snprintf(new_txt, sizeof(new_txt), "%s%s", current_txt ? current_txt : "", btn_txt);
            lv_textarea_set_text(current_input, new_txt);
        }
    }
}

// 12. 键盘空白区域点击回调：点击键盘空白处隐藏键盘
static void keyboard_click_handler(lv_event_t *e) {
    if (lv_event_get_code(e) == LV_EVENT_CLICKED && 
        lv_event_get_target(e) == num_keyboard) {
        lv_obj_add_flag(num_keyboard, LV_OBJ_FLAG_HIDDEN);
    }
}

// 13. 延迟隐藏键盘回调：避免输入框失焦时立即隐藏（影响按钮点击）
static void hide_keyboard_timer_cb(lv_timer_t *t) {
    if (num_keyboard && current_input == NULL) {
        lv_obj_add_flag(num_keyboard, LV_OBJ_FLAG_HIDDEN);
    }
    lv_timer_del(t);  // 执行后销毁定时器
}

// 14. 取票成功后UI重置回调：清空输入框、恢复按钮样式
static void success_reset_ui_cb(lv_timer_t *timer) {
    if (ui_TextArea1) lv_textarea_set_text(ui_TextArea1, "");
    if (ui_TextArea2) lv_textarea_set_text(ui_TextArea2, "");
    reset_take_btn_style(timer);
    reset_btn_timer = NULL;
}

// 15. 创建数字键盘：初始化键盘布局、按钮、样式
static void create_num_keyboard(void) {
    if (num_keyboard != NULL) return;  // 避免重复创建

    // 1. 创建键盘容器
    num_keyboard = lv_obj_create(lv_scr_act());
    lv_obj_set_size(num_keyboard, KEYBOARD_WIDTH, KEYBOARD_HEIGHT);
    lv_obj_set_pos(num_keyboard, 0, 150);  // 键盘位置
    // 键盘样式：浅灰色背景、圆角、灰色边框
    lv_obj_set_style_bg_color(num_keyboard, lv_color_hex(0xF0F0F0), 0);
    lv_obj_set_style_radius(num_keyboard, 10, 0);
    lv_obj_set_style_border_width(num_keyboard, 1, 0);
    lv_obj_set_style_border_color(num_keyboard, lv_palette_main(LV_PALETTE_GREY), 0);

    // 2. 添加键盘空白区域点击事件（用于隐藏键盘）
    lv_obj_add_event_cb(num_keyboard, keyboard_click_handler, LV_EVENT_CLICKED, NULL);

    // 3. 创建12个键盘按钮（4行3列）
    for (int i = 0; i < 12; i++) {
        // 创建按钮
        lv_obj_t *btn = lv_btn_create(num_keyboard);
        lv_obj_set_size(btn, KEYBOARD_BTN_WIDTH, KEYBOARD_BTN_HEIGHT);
        // 按钮布局：横向间距5px、纵向间距5px，左上方偏移10px
        lv_obj_align(btn, LV_ALIGN_TOP_LEFT, 
                    (i % 3) * (KEYBOARD_BTN_WIDTH + 5) + 10, 
                    (i / 3) * (KEYBOARD_BTN_HEIGHT + 5) + 10);
        // 按钮样式：圆角5px
        lv_obj_set_style_radius(btn, 5, 0);
        // 绑定按钮点击事件
        lv_obj_add_event_cb(btn, num_keyboard_event_cb, LV_EVENT_CLICKED, NULL);

        // 创建按钮标签（数字/功能文本）
        lv_obj_t *label = lv_label_create(btn);
        lv_label_set_text(label, btn_texts[i]);
        lv_obj_center(label);  // 标签居中
    }
}

// 输入框聚焦回调
static void input_focused(lv_event_t *e) {
    current_input = lv_event_get_target(e);
    create_num_keyboard();          // 创建/显示键盘
    lv_obj_clear_flag(num_keyboard, LV_OBJ_FLAG_HIDDEN);  // 确保键盘可见
}



// 18. 发送验证码按钮回调：验证取票码、生成验证码、启动倒计时
static void send_verify_event_cb(lv_event_t *e) {
    // 检查按钮和标签有效性（避免空指针导致乱码）
    if (!ui_Button8) {
        printf("[ERROR] 发送验证码按钮不存在！\n");
        return;
    }
    lv_obj_t *btn_label = get_btn_label_safe(ui_Button8);
    if (!btn_label) {
        printf("[ERROR] 验证码按钮标签不存在！\n");
        return;
    }

    // 检查倒计时状态（避免重复触发）
    if (verify_cooldown > 0 || cooldown_timer != NULL) {
        return;
    }

    // 获取并验证取票码（处理NULL情况）
    const char *ticket_code = lv_textarea_get_text(ui_TextArea1);
    if (!ticket_code) ticket_code = "";

    if (strlen(ticket_code) == 0) {  // 取票码为空：提示错误并重置样式
        // 销毁旧的重置定时器（避免重复）
        if (reset_btn_timer) {
            lv_timer_del(reset_btn_timer);
        }
        // 错误状态：红色背景、提示文本（设置字体避免乱码）
        lv_obj_set_style_bg_color(ui_Button8, lv_palette_main(LV_PALETTE_RED), 0);
        lv_label_set_text(btn_label, "请输入取票号");
        lv_obj_set_style_text_font(btn_label, &lv_font_sunti_24, 0); 
        lv_obj_clear_flag(ui_Button8, LV_OBJ_FLAG_CLICKABLE); // 临时禁用
        // 2秒后恢复默认样式
        reset_btn_timer = lv_timer_create(reset_verify_btn_style, RESET_BTN_DELAY, NULL);
        return;
    }

    // 生成并“发送”验证码（输入合法时）
    generate_verify_code();
    printf("[INFO] 发送验证码：%s 到订单：%s\n", generated_verify_code, ticket_code);
    // 调试用：显示验证码（实际项目需隐藏）
    if (ui_Label9) {
        lv_label_set_text(ui_Label9, generated_verify_code);
        lv_obj_clear_flag(ui_Label9, LV_OBJ_FLAG_HIDDEN);
    }

    // 启动倒计时
    verify_cooldown = COOLDOWN_SECONDS;
    update_verify_btn_state();  // 立即更新一次状态
    // 创建倒计时定时器（1秒触发一次）
    if (cooldown_timer) {
        lv_timer_del(cooldown_timer);
    }
    cooldown_timer = lv_timer_create(cooldown_timer_cb, 1000, NULL);
    // 检查定时器创建结果（避免无效定时器）
    if (!cooldown_timer) {
        printf("[WARN] 倒计时定时器创建失败！\n");
        verify_cooldown = 0;
        update_verify_btn_state();
    }
}

// 19. 取票按钮回调：验证取票码、验证码，处理取票结果
static void take_ticket_event_cb(lv_event_t *e) {
    // 1. 检查核心UI对象（避免空指针访问）
    if (!ui_Button9 || !ui_TextArea1 || !ui_TextArea2) {
        printf("[ERROR] take_ticket_event_cb: Missing UI elements\n");
        return;
    }

    // 2. 获取输入内容（处理NULL情况）
    const char *ticket_code = lv_textarea_get_text(ui_TextArea1);
    const char *verify_code = lv_textarea_get_text(ui_TextArea2);
    if (!ticket_code) ticket_code = "";
    if (!verify_code) verify_code = "";

    // 3. 验证输入合法性
    int is_valid = 1;
    lv_obj_t *btn_label = get_btn_label_safe(ui_Button9);
    if (!btn_label) return;  // 无标签则退出

    // 销毁旧的重置定时器（避免重复）
    if (reset_btn_timer) {
        lv_timer_del(reset_btn_timer);
    }

    // 验证1：取票码为空
    if (strlen(ticket_code) == 0) {
        lv_label_set_text(btn_label, "请输入取票码");
        lv_obj_set_style_text_font(btn_label, &lv_font_sunti_24, 0); 
        is_valid = 0;
    }
    // 验证2：验证码不是6位
    else if (strlen(verify_code) != VERIFY_CODE_LENGTH) {
        lv_label_set_text(btn_label, "请输入完整验证码");
        lv_obj_set_style_text_font(btn_label, &lv_font_sunti_24, 0); 
        is_valid = 0;
    }
    // 验证3：验证码不匹配
    else if (strcmp(verify_code, generated_verify_code) != 0) {
        lv_label_set_text(btn_label, "验证码错误");
        lv_obj_set_style_text_font(btn_label, &lv_font_sunti_24, 0); 
        is_valid = 0;
    }

    // 4. 处理验证结果
    if (!is_valid) {  // 验证失败：红色背景，3秒后重置
        lv_obj_set_style_bg_color(ui_Button9, lv_palette_main(LV_PALETTE_RED), 0);
        reset_btn_timer = lv_timer_create(reset_take_btn_style, 3000, NULL);
    } else {  // 验证成功：绿色背景，提示成功，5秒后重置UI
        lv_obj_set_style_bg_color(ui_Button9, lv_palette_main(LV_PALETTE_GREEN), 0);
        lv_label_set_text(btn_label, "取票成功");
        printf("[INFO] 取票成功！订单号：%s\n", ticket_code);
        // 5秒后重置输入框和按钮样式
        reset_btn_timer = lv_timer_create(success_reset_ui_cb, SUCCESS_RESET_DELAY, NULL);
    }
}

// 20. 取票界面初始化：绑定事件、初始化状态
void Collect_tickets() {
    // 初始化验证码按钮（关键：强制设置初始文本和样式）
    if (ui_Button8) {
        lv_obj_t *verify_btn_label = get_btn_label_safe(ui_Button8);
        if (verify_btn_label) {
            lv_label_set_text(verify_btn_label, "获取验证码"); // 初始显示正确文本
            lv_obj_set_style_text_font(verify_btn_label, &lv_font_sunti_24, 0); // 设置字体
        }
        // 设置初始样式
        lv_obj_set_style_bg_color(ui_Button8, lv_palette_main(LV_PALETTE_BLUE), 0);
        lv_obj_add_flag(ui_Button8, LV_OBJ_FLAG_CLICKABLE);
    } else {
        printf("[ERROR] 验证码按钮ui_Button8未初始化\n");
        return;
    }
    // 初始化取票按钮（新增：设置初始文本“取票”和样式）
    if (ui_Button9) {
        lv_obj_t *take_btn_label = get_btn_label_safe(ui_Button9);
        if (take_btn_label) {
            lv_label_set_text(take_btn_label, "取票"); // 为取票按钮设置初始文本
            lv_obj_set_style_text_font(take_btn_label, &lv_font_sunti_24, 0); // 统一字体
        }
        // 设置初始样式（与验证码按钮保持视觉一致）
        lv_obj_set_style_bg_color(ui_Button9, lv_palette_main(LV_PALETTE_BLUE), 0);
        lv_obj_add_flag(ui_Button9, LV_OBJ_FLAG_CLICKABLE);
    } else {
        printf("[ERROR] 取票按钮ui_Button9未初始化\n");
        return;
    }

    // 绑定按钮事件
    lv_obj_add_event_cb(ui_Button8, send_verify_event_cb, LV_EVENT_CLICKED, NULL);  // 验证码按钮
    lv_obj_add_event_cb(ui_Button9, take_ticket_event_cb, LV_EVENT_CLICKED, NULL);  // 取票按钮

    // 绑定输入框事件（聚焦显示键盘，失焦隐藏键盘）
    if (ui_TextArea1) {
        lv_obj_add_event_cb(ui_TextArea1, input_focused, LV_EVENT_FOCUSED, NULL);  // 聚焦
       
    }
    if (ui_TextArea2) {
        lv_obj_add_event_cb(ui_TextArea2, input_focused, LV_EVENT_FOCUSED, NULL);  // 聚焦
        
    }

    // 初始化调试标签（隐藏状态）
    if (ui_Label9) {
        lv_obj_add_flag(ui_Label9, LV_OBJ_FLAG_HIDDEN);
    }

    // 初始化键盘（隐藏状态）
    if (num_keyboard) {
        lv_obj_add_flag(num_keyboard, LV_OBJ_FLAG_HIDDEN);
    }

    
}

// 21. 取票界面销毁：释放资源，避免内存泄漏
void destroy_ticket_taking_ui() {
    // 1. 销毁定时器（避免定时器回调访问已释放对象）
    if (cooldown_timer) {
        lv_timer_del(cooldown_timer);
        cooldown_timer = NULL;
    }
    if (reset_btn_timer) {
        lv_timer_del(reset_btn_timer);
        reset_btn_timer = NULL;
    }

    // 2. 销毁数字键盘（释放UI资源）
    if (num_keyboard) {
        lv_obj_del(num_keyboard);
        num_keyboard = NULL;
    }

    // 3. 重置全局状态（避免下次初始化受影响）
    verify_cooldown = 0;
    current_input = NULL;
    memset(generated_verify_code, 0, sizeof(generated_verify_code));
}
// 输入框失焦回调（新增实现）
static void input_blurred(lv_event_t *e) {
    current_input = NULL;
    // 延迟隐藏键盘，避免影响按钮点击
    lv_timer_create(hide_keyboard_timer_cb, 500, NULL);
}